home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / cexpress / strings / delmddlp.asm < prev    next >
Encoding:
Assembly Source File  |  1989-05-04  |  2.2 KB  |  81 lines

  1. ;void  delete_middle_plus(strg,position,left,right);
  2. ;  unsigned char  *strg,left,right;
  3. ;  unsigned short  position;
  4.  
  5.     EXTRN  _memory_model:byte
  6.     EXTRN  _error_code:byte
  7.  
  8. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  9.     ASSUME CS:_TEXT
  10.     PUBLIC _delete_middle_plus
  11. _delete_middle_plus proc near
  12.     push bp            ;
  13.     mov  bp,sp        ;set stack frame
  14.     push di            ;
  15.     push si            ;
  16.     push ds            ;
  17.     mov  _error_code,1    ;1 = error occured
  18.     cmp  _memory_model,0    ;near or far?
  19.     jle  begin        ;jump if near
  20.     inc  bp            ;else add 2 to BP
  21.     inc  bp            ;
  22. begin:    cmp  _memory_model,2    ;data near or far?
  23.     jb   L0            ;jump if near
  24.     lds  si,dword ptr[bp+4] ;DS:SI pts to Strg
  25.     inc  bp            ;add 2 to bp since dword ptr
  26.     inc  bp            ;
  27.     jmp  short L1        ;
  28. L0:    mov  si,[bp+4]        ;NEAR case
  29. L1:    mov  cx,[bp+6]        ;get starting position
  30.     inc  cx            ;count from 1
  31.     mov  dx,cx        ;make a copy
  32. L2:    cmp  byte ptr[si],0    ;seek start position
  33.     je   L8            ;quit if start not within string
  34.     inc  si            ;forward ptr
  35.     loop L2            ;loop to start point
  36.     dec  si            ;ptr overshoots
  37.     mov  di,si        ;copy ptr position
  38.     mov  cx,dx        ;number chars to start of string
  39.     mov  ah,[bp+8]        ;get left border char
  40.     mov  bh,[bp+10]        ;right border char
  41.     mov  al,[si]        ;get char at starting position
  42.     cmp  al,ah        ;test against border chars
  43.     je   L8            ;
  44.     cmp  al,bh        ;
  45.     je   L8            ;
  46. L3:    dec  si            ;pull ptr back one byte
  47.     cmp  [si],ah        ;is char a border char?
  48.     je   L5            ;jump when found
  49.     loop L3            ;loop
  50. L4:    inc  si            ;don't delete border char
  51. L5:    mov  al,es:[di]        ;get a char
  52.     cmp  al,0        ;end of string?
  53.     je   L7            ;jump if so
  54.     cmp  al,bh        ;right border char?
  55.     je   L5B        ;jump if so
  56.     inc  di            ;else forward ptr
  57.     jmp  short L5        ;loop
  58. L5B:    inc di            ;
  59. L6:    mov  al,es:[di]        ;now transfer down top end of string
  60.     mov  [si],al        ;
  61.     cmp  al,0        ;terminator?
  62.     je   L7B        ;quit if so
  63.     inc  si            ;inc the ptrs
  64.     inc  di            ;
  65.     jmp  short L6        ;loop
  66. L7:    mov  byte ptr[si],0    ;no right border case
  67. L7B:    pop  ds            ;
  68.     mov  _error_code,0    ;no error
  69.     jmp  short L9        ;
  70. L8:    pop  ds            ;restore DS
  71. L9:    pop  si            ;
  72.     pop  di            ;
  73.     pop  bp            ;
  74.     cmp  _memory_model,0    ;quit
  75.     jle  quit        ;
  76.     db   0CBh        ;RET far
  77. quit:    ret            ;RET near
  78. _delete_middle_plus ENDP
  79. _TEXT    ENDS
  80.     END
  81.